/*
 * (x) Henrique Jotha 2011
 * 
 * Popula o banco de dados a partir dos arquivos:
 * 
 * artistas.txt
 * discos.txt
 * estilos.txt
 * musicas.txt
 * usuarios.txt
 * 
 */
package br.unirio.bsi.dsw.AuctionLoader;

import java.util.ArrayList;
import java.io.FileNotFoundException;

import br.unirio.bsi.dsw.AuctionSite.model.EstiloArtista;
import br.unirio.bsi.dsw.AuctionSite.model.Estilo;
import br.unirio.bsi.dsw.AuctionSite.model.Album;
import br.unirio.bsi.dsw.AuctionSite.model.Artista;
import br.unirio.bsi.dsw.AuctionSite.model.Musica;
import br.unirio.bsi.dsw.AuctionSite.model.Usuario;

import br.unirio.bsi.dsw.AuctionSite.model.dao.GenericDAO;
import br.unirio.bsi.dsw.AuctionLoader.util.amazon.AmazonWebServiceUtils;

// holder instances impl
class EstiloArtistaImpl extends EstiloArtista {}
class EstiloImpl extends Estilo {}
class AlbumImpl extends Album {}
class ArtistaImpl extends Artista {}
class MusicaImpl extends Musica {}
class UsuarioImpl extends Usuario {}

public class Loader 
{
  public static final String DB_NAME = "LEILAO";

  private static final String DB_BIN_PATH = "C:\\Program Files\\PostgreSQL\\9.0\\bin\\";  
  
  private static final String DB_DROP_CMD = "dropdb -h localhost -U postgres " + DB_NAME;
  private static final String DB_CREATE_CMD = "createdb -h localhost -U postgres " + DB_NAME;
  
  private static final String DATA_PATH = "..\\..\\spec\\BaseDados\\";
  
  // OPERATION FLAGS -- CHANGE ACCORDINGLY
  private static final boolean DROP_DB = false;
  private static final boolean LOAD_DB = false;
  private static final boolean LOAD_ESTILO = false;
  private static final boolean LOAD_ARTISTA = false;
  private static final boolean LOAD_ESTILOARTISTA = false;
  private static final boolean LOAD_ALBUM = true;
  private static final boolean LOAD_MUSICAS = false;
  private static final boolean LOAD_USUARIO = false;  
  
  public static void main(String[] args) 
  {     
    try
    {       
      if( DROP_DB ) 
      {
        // delete the database 
        Process pddb = Runtime.getRuntime().exec(DB_BIN_PATH + DB_DROP_CMD);
        pddb.waitFor();

        // create the database
        Process pcdb = Runtime.getRuntime().exec(DB_BIN_PATH + DB_CREATE_CMD);
        pcdb.waitFor();
      }

      // pega instancia do DAO
      GenericDAO gD = GenericDAO.getInstance( DB_NAME );

      if( LOAD_DB )
      {
        // carrega o script do banco
        gD.executeFile( DATA_PATH + DB_NAME + ".sql" );      
      }
      
      // READERS
      // carrega a lista de estilos 
      Reader re = new Reader<EstiloImpl>( DATA_PATH, ' ', EstiloImpl.class );
      // carrega a lista de artistas 
      Reader ra = new Reader<ArtistaImpl>( DATA_PATH, '#', ArtistaImpl.class );
      // carrega a lista de albums
      Reader rab = new Reader<AlbumImpl>( DATA_PATH, '#', AlbumImpl.class );
      // carrega a lista de musicas
      Reader rm = new Reader<MusicaImpl>( DATA_PATH, '#', MusicaImpl.class );
      // carrega a lista inicial de usuarios
      Reader ru = new Reader<UsuarioImpl>( DATA_PATH, '#', UsuarioImpl.class );

      Integer last0 = 0, last1 = 0; 
          
      if( LOAD_ESTILO ) 
      {
        // insere cada Estilo
        System.out.println("Inserindo Estilos...");
        for( Estilo e : (Estilo[])re.getGenericsList() )
        {
          switch( e.getIDSuperEstilo() )
          {
            case 0:
              last0 = e.getID();
              break;

            case 1:
              last1 = e.getID();
              e.setIDSuperEstilo( last0 );
              break;

            case 2:
              e.setIDSuperEstilo( last1 );
              break;
          }        

          gD.insert( e );
        }
      }
   
      if( LOAD_ARTISTA ) 
      {      
        // insere cada Artista
        System.out.println("Inserindo Artistas...");      
        for( Artista a : (Artista[])ra.getGenericsList() )
          gD.insert( a );
      }
      
      if( LOAD_ESTILOARTISTA )
      {
        // cria a relação EstiloArtista
        ArrayList<EstiloArtistaImpl> rea = new ArrayList<EstiloArtistaImpl>();        

        // pra todos os artistas
        for( Artista a : (Artista[])ra.getGenericsList() )
        {
          // pra cada estilo s do artista a
          for( String s : a.getEstilos() ) 
          {          
            // pra todos os estilos
            for( Estilo e : (Estilo[])re.getGenericsList() )
            {
              // se o estilo s esta na lista de estilos
              if( e.getNome().equals(s) )
              {
                 // faz a relação EstiloArtista
                 EstiloArtistaImpl ea = new EstiloArtistaImpl();
                 ea.setIDArtista( a.getID() );
                 ea.setIDEstilo( e.getID() );
                 rea.add(ea);
                 break;
              }
            }          
          }
        }

        // insere cada EstiloArtista  
        System.out.println("Inserindo EstiloArtista...");      
        for( EstiloArtista ea : rea )
          gD.insert( ea );
        
         rea = null;
      }

      if( LOAD_ALBUM )
      {      
        // insere cada Album
        // requisitando a url da capa do album ao amazon
        AmazonWebServiceUtils awsu = AmazonWebServiceUtils.getInstance();

        awsu.init_cache( DATA_PATH + "urlcache.txt" );

        System.out.println("Inserindo Albums...");
        for( Album a : (Album[])rab.getGenericsList() )
        {
          String artist = "";
          for( Artista b : (Artista[])ra.getGenericsList() )
            if( a.getIDArtista().equals( b.getID() ) ) {
              artist = b.getNome();
              break;
            }

          Album t = new AlbumImpl();
          t.setID( a.getID() );
          
          if( gD.retrieve(t) == null )
          {
            a.setUrl( awsu.getAlbumArtURL(artist, a.getNome()) );
            gD.insert( a );
          }
          else
          if( t.getUrl() == null || t.getUrl().isEmpty() )
          {
            a.setUrl( awsu.getAlbumArtURL(artist, a.getNome()) );
            gD.update( a );
          }
        }

        awsu.save_cache();
      }      
      
      if( LOAD_MUSICAS )
      {            
        // insere cada Musica
        System.out.println("Inserindo Musicas...");
        last0 = 0;
        for( Musica m : (Musica[])rm.getGenericsList() )
        {        
          if( !last0.equals( m.getIDAlbum() ) ) {
            last1 = 1;
            last0 = m.getIDAlbum();          
          }
          else
            last1++;

          m.setOrdem( last1 );

          gD.insert( m );
        }
      }

      if( LOAD_USUARIO )
      {                  
        // insere cada Usuario
        System.out.println("Inserindo Usuarios...");      
        for( Usuario u : (Usuario[])ru.getGenericsList() )
          gD.insert( u );
      }
      
      // nothingness  
      gD = null;
      re = ra = rab = rm = ru = null;
    }
    catch( FileNotFoundException ex )
    {
      System.out.println("Cannot find file:" + ex.toString() );
    }
    catch( Exception e )
    {
      System.out.println("Erro: " + e.getMessage());
    }
  }
}
